package bancosys.tec.persist.audit.domain;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

import jmine.tec.persist.annotation.DiscriminatorComment;
import bancosys.tec.component.Documentation;

/**
 * @created 03/10/2007
 * @author Gustavo Almeida
 */
@Entity
@DiscriminatorValue("2")
@DiscriminatorComment("PROPRIEDADE COM VALOR AUDITADO")
public class AuditValuedProperty extends AuditProperty {
    private String oldValue;

    private String newValue;

    /**
     * Devolve o valor antigo da propriedade.
     * 
     * @return o valor antigo da propriedade.
     */
    @Column(name = "OLD_VALUE", nullable = true, length = MAX_VARCHAR_LEN)
    @Documentation("VALOR ANTIGO DA PROPRIEDADE.")
    public String getOldValue() {
        return this.oldValue;
    }

    /**
     * Devolve o valor novo da propriedade.
     * 
     * @return o valor novo da propriedade.
     */
    @Column(name = "NEW_VALUE", nullable = true, length = MAX_VARCHAR_LEN)
    @Documentation("NOVO VALOR DA PROPRIEDADE.")
    public String getNewValue() {
        return this.newValue;
    }

    /**
     * Define o oldValue.
     * 
     * @param oldValue O oldValue a ser definido.
     */
    protected void setOldValue(String oldValue) {
        this.oldValue = oldValue;
    }

    /**
     * Define o oldValue.
     * 
     * @param oldValue O oldValue a ser definido.
     */
    public void setOldValue(Object oldValue) {
        this.oldValue = this.trimPropertyValue(oldValue);
    }

    /**
     * Define o newValue.
     * 
     * @param newValue O newValue a ser definido.
     */
    protected void setNewValue(String newValue) {
        this.newValue = newValue;
    }

    /**
     * Define o newValue.
     * 
     * @param newValue O newValue a ser definido.
     */
    public void setNewValue(Object newValue) {
        this.newValue = this.trimPropertyValue(newValue);
    }

    /**
     * Retorna o valor do objeto informado serializado em uma {@link String}, respeitando o parametro {@link AuditProperty#MAX_VARCHAR_LEN}.
     * 
     * @param value value
     * @return uma {@link String} que representa o objeto value, com o maximo {@link AuditProperty#MAX_VARCHAR_LEN} chars
     */
    private String trimPropertyValue(Object value) {
        String strValue = null;
        if (value != null) {
            strValue = value.toString();
            if ((strValue != null) && (strValue.length() > MAX_VARCHAR_LEN)) {
                strValue = strValue.substring(0, MAX_VARCHAR_LEN);
            }
        } else {
            return "<null>";
        }
        return strValue;
    }

    /**
     * Devolve a representação string de uma <code>Property</code>.
     * 
     * @return a representação string de uma <code>Property</code>.
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder(super.toString());
        sb.append(": ").append(this.oldValue);
        sb.append(" -> ").append(this.newValue);
        return sb.toString();
    }
}
